\begin{lstlisting}[caption=使用反射自省,label=src:introspection]
|\begin{tikzpicture}[overlay]
\ubrace{3.2,-4.2}{2.2,-4.2}{%
We are dealing with a \type{Type} and according %
to the documentation\footnote{\texttt{go doc reflect}}:%
\begin{quote} %
// Elem returns a type's element type. \\ %
// It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice.\\ %
\func{Elem() Type} %
\end{quote} %
同样的在 \var{t} 使用 \func{Elem()} 得到了指针指向的值。}
\ubrace{4.9,-4.2}{3.8,-4.2}{现在已经定义了可以“深入”结构体的指针。
就可以使用 \func{Field(0)} 访问零值字段；}%
%
\ubrace{6.0,-4.2}{5.1,-4.2}{%
结构 \type{StructField} 有成员 \var{Tag}，返回字符串类型的标签名。%
因此，在第 $0^{th}$ 个字段上可以用 \func{.Tag} 访问这个名字：\texttt{Field(0).Tag}。%
这样得到了 \texttt{namestr}。}
\end{tikzpicture}|
type Person struct {
    name string "namestr" |\coderemark{\texttt{"namestr"} 是标签}|
    age  int
}

func ShowTag(i interface{}) {   |\coderemark{*Person 作为参数调用}|
 switch t := reflect.TypeOf(i); t.Kind() {
 case reflect.Ptr: |\coderemark{一个指针，也就是~\var{reflect.Ptr}}|
   tag := t.Elem().Field(0).Tag
\end{lstlisting}
